package redis

import (
	"errors"
	"github.com/go-redis/redis"
	"time"
)

/*
  设置redis普通数据

  参数：
  key:设置成员的名称
  value:设置成员的值
  timeOuts:定时过期时间，如果没有传则按照非定时变量设置

  返回:
  错误信息，如果没有则是nil
*/
// ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
func SetRedisItems(key, value string, timeOuts ...time.Duration) error {
	// 用户设置过期时间
	var timeOut time.Duration

	//判断用户是否传入了定时过期时间
	//----------------------------------------------------------------------------------------------------------
	if timeOuts != nil {
		//存在则取第一位数据进行赋予
		timeOut = timeOuts[0]
	} else {
		//否则按照 0 进行传入
		timeOut = 0
	}

	//进行设置对应内容
	//----------------------------------------------------------------------------------------------------------
	err := Redis.Set(key, value, timeOut).Err()

	//如果报错则进行打印，且弹出错误
	if err != nil {
		return err
	}

	//设置成功则返回nil
	//----------------------------------------------------------------------------------------------------------
	return nil
}

/*
  获取redis成员数据

  参数:
   key:查询数据的名称

  返回:
  value:查询成功后的数据，如果没有或者错误则为空字符串
  err:错误信息，如果过期则返回密钥已过期，否则是错误信息，如果成功则为nil
*/
// ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
func GetRedisItem(key string) (value string, err error) {
	// 获取数据
	value, err = Redis.Get(key).Result()

	//判断是否已经过期
	//----------------------------------------------------------------------------------------------------------
	if err == redis.Nil {
		return "", errors.New("密钥已过期")

		//如果获取报错
	} else if err != nil {
		return "", err
	}

	//成功获取时
	//----------------------------------------------------------------------------------------------------------
	return value, nil
}

/*
  更新定时redis定时成员到期时间

  参数:
   key:查询数据的名称
   timeOut:重新设置的时间

  返回:
  错误信息，如果没有则是nil
*/
// ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
func UpdateRedisItemTimeOut(key string, timeOut time.Duration) error {
	// 更新键的有效期
	err := Redis.Expire(key, timeOut).Err()

	//判断是否更新失败
	//----------------------------------------------------------------------------------------------------------
	if err != nil {
		return err
	}

	//更新成功则为nil
	//----------------------------------------------------------------------------------------------------------
	return nil
}

/*
  删除redis成员数据

  参数:
   key:查询数据的名称

  返回:
  err:错误信息，如果成功则为nil
*/
// ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
func DeleteRedisItem(key string) error {
	//删除查询成员
	err := Redis.Del(key).Err()

	//如果删除失败则返回错误
	//----------------------------------------------------------------------------------------------------------
	if err != nil {
		return err
	}

	//删除成功则返回nil
	//----------------------------------------------------------------------------------------------------------
	return nil
}
